package com.hcbd.tdwt.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

import com.hcbd.tdwt.R;


/**
 * - @Description:  联系人字母索引
 * - @Author:  LXJ
 * - @Time:  2018/12/5 15:00
 */
public class SideBar extends View {
    // 申明监听器接口引用
    private OnTouchingLetterChangedListener onTouchingLetterChangedListener;
    // 26个字母
    public static String[] b = {"+", "A", "B", "C", "D", "E", "F", "G", "H",
            "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
            "V", "W", "X", "Y", "Z", "#"};
    private int choose = -1;// 当前被选中文字在数组里面的下标
    private Paint paint = new Paint();

    private TextView mTextDialog;

    public void setTextView(TextView mTextDialog) {
        this.mTextDialog = mTextDialog;
    }

    public SideBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public SideBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SideBar(Context context) {
        super(context);
    }

    /**
     * 重画方法(绘画View)
     */
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 获取焦点改变背景颜色.
        int height = getHeight(); // 获取控件高度
        int width = getWidth(); // 获取控件宽度
        int singleHeight = height / b.length; // 获取每一个字母的高度

        //获取屏幕宽、高
        DisplayMetrics d = getResources().getDisplayMetrics();
        float heightPixels = d.heightPixels;
        //获取分辨率比率
        float rate = ((float) height) / heightPixels;

        for (int i = 0; i < b.length; i++) {
            //paint.setColor(Color.WHITE);
            paint.setColor(Color.parseColor("#333333")); // 指定颜色代码
            // paint.setColor(Color.rgb(33,66,99)); // 使用三原色代码
            // DEFAULT 默认字体样式 DEFAULT_BOLD 粗体 MONOSPACE 等宽 SANS_SERIF 无截线 SERIF 截线
            paint.setTypeface(Typeface.DEFAULT);
            paint.setAntiAlias(true); // 抗锯齿
            if (heightPixels <= 320) {
                paint.setTextSize(10 * rate); // 设置字体大小
            } else if (heightPixels <= 800) {
                paint.setTextSize(25 * rate); // 设置字体大小
            } else if (heightPixels <= 1080) {
                paint.setTextSize(35 * rate); // 设置字体大小
            } else if (heightPixels <= 1280) {
                paint.setTextSize(40 * rate); // 设置字体大小
            } else if (heightPixels <= 1600) {
                paint.setTextSize(50 * rate); // 设置字体大小
            } else if (heightPixels <= 1920) {
                paint.setTextSize(60 * rate); // 设置字体大小
            } else if (heightPixels <= 2560) {
                paint.setTextSize(70 * rate); // 设置字体大小
            }
            // 检测当前要绘画的文字是否为被选中的文字
            if (i == choose) {
                paint.setColor(getResources().getColor(
                        R.color.colorPrimaryTransparent30));
                paint.setFakeBoldText(true); // 设置粗体文字
            }
            // x坐标等于中间-字符串宽度的一半.
            float xPos = width / 2 - paint.measureText(b[i]) / 2;
            float yPos = singleHeight * i + singleHeight;
            // 设置每一个文字的坐标
            canvas.drawText(b[i], xPos, yPos, paint);
            paint.reset();// 重置画笔
        }

    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        final int action = event.getAction(); // 获取点击事件
        final float y = event.getY();// 获取点击时Y的坐标
        final int oldChoose = choose;
        final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
        // 根据Y的值计算选中的文字的下标
        int index = (int) ((y / getHeight()) * b.length);// 点击y坐标所占总高度的比例 * b数组的长度就等于点击b中文字的下标.
        // 防止下标越界
        if (index >= b.length) {
            index = b.length - 1;
        } else if (index < 0) {
            index = 0;
        }

        switch (action) {
            case MotionEvent.ACTION_UP:
                backUpScene();
                break;
            default:
                //                setBackgroundColor(getResources().getColor(R.color.slidebar_backgroud));
                if (oldChoose != index) {
                    if (index >= 0 && index < b.length) {
                        if (listener != null) {
                            listener.onTouchingLetterChanged(b[index]);
                        }
                        if (mTextDialog != null) {
                            mTextDialog.setText(b[index]);
                            mTextDialog.setVisibility(View.VISIBLE); // 显示中间的文字框
                        }
                        choose = index;
                        invalidate(); // 刷新View，重画界面，调用onDraw方法
                    }
                }
                break;
        }
        return true; // 事件分发，自己消化处理。
    }

    public void backUpScene() {
        //        setBackgroundColor(Color.TRANSPARENT); // 使用系统颜色代码作为背景
        // setBackgroundDrawable(new ColorDrawable(0x00000000)); // 使用颜色背景
        // 使用通过资源id获取的颜色作为背景
        // setBackgroundColor(getResources().getColor(R.color.slidebar_backgroud));
        choose = -1;//
        invalidate(); // 刷新View
        if (mTextDialog != null) {
            mTextDialog.setVisibility(View.INVISIBLE); // 隐藏中间的文字框
        }
    }

    /**
     * 自定义回调接口-三部曲
     * 1.自定义监听器接口
     * 2.申明一个该接口的引用
     * 3.设置接口的添加监听的set方法
     * 4.在程序需要回调处理的地方调用该接口的方法进行回调（设置监听触发）
     * 5.为SideBar设置回调监听的真正实现
     */

    /**
     * 设置字母导航栏监听器
     *
     * @param onTouchingLetterChangedListener 字母导航栏监听器
     */
    public void setOnTouchingLetterChangedListener(
            OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
        this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
    }

    /**
     * 字母导航栏监听器接口
     *
     * @author dong
     */
    public interface OnTouchingLetterChangedListener {
        void onTouchingLetterChanged(String s);
    }

}
